<html>
    <head>
        <title>字符串加密</title>
    </head>
    <body>
        <script>
            // 字符串加密

                /*
                    ABP提供字符串加密功能，允许加密和解密字符串。
                */

                /*
                    一、安装

                            默认情况下，此软件包已与启动模板一起安装。所以，大多数时候，你不需要手动安装它。

                            如果需要安装，建议使用ABP CLI安装此软件包。


                            1、使用 abp cli 安装

                                    在项目文件夹（. csproj文件）中打开命令行窗口并键入以下命令：

                                        abp add-package Volo.Abp.Security

                            2、手动安装 

                                    如果需要手动安装：

                                    将 "Volo.Abp.Security" NuGet包添加到你的项目中：

                                        Install-Package Volo.Abp.Security

                                    将AbpSecurityModule添加到模块的依赖列表中：

                                        [DependsOn(
                                            //...other dependencies
                                            typeof(AbpSecurityModule) // <-- Add module dependency like that
                                            )]
                                        public class YourModule : AbpModule
                                        {
                                        }
                */

                /*
                    二、使用字符串加密

                            1、如何加密和解密：

                                        所有加密操作都包含在IStringEncryptionService中。你可以注入它并开始使用。

                                        例如：

                                                public class MyService : DomainService
                                                {
                                                    protected IStringEncryptionService StringEncryptionService { get; }

                                                    public MyService(IStringEncryptionService stringEncryptionService)
                                                    {
                                                        StringEncryptionService = stringEncryptionService;
                                                    }

                                                    public string Encrypt(string value)
                                                    {
                                                        // 对字符串值进行加密
                                                        return StringEncryptionService.Encrypt(value);
                                                    }

                                                    public string Decrypt(string value)
                                                    {
                                                        // 对字符串值进行解密
                                                        return StringEncryptionService.Decrypt(value);
                                                    }
                                                }

                            2、使用自定义密码：

                                        IStringEncryptionService方法具有默认值的passPharase参数，当你不传递passPhrase参数时，它使用默认PassPhrase

                                                // 默认传递 "Phrase"
                                                var encryptedValue = StringEncryptionService.Encrypt(value);

                                                // 自定义密码 
                                                var encryptedValue = StringEncryptionService.Encrypt(value, "MyCustomPassPhrase");

                                                // 加密和解密拥有相同的密码
                                                var decryptedValue = StringEncryptionService.Decrypt(value, "MyCustomPassPhrase");


                            3、自定义加密盐 Using Custom Salt 

                                        IStringEncryptionService方法具有默认值的盐参数，当你不传递参数时，它使用默认盐：

                                                // 默认传递 "Salt"  为盐参数值
                                                var encryptedValue = StringEncryptionService.Encrypt(value);

                                                // 自定义盐参数值
                                                var encryptedValue = StringEncryptionService.Encrypt(value, salt: Encoding.UTF8.GetBytes("MyCustomSalt")); 

                                                // 加密和解密的盐参数值相同
                                                var decryptedValue = StringEncryptionService.Decrypt(value,  salt: Encoding.UTF8.GetBytes("MyCustomSalt"));


                                        ★、加密技术中Salt的概念：

                                                概念                  作用                                          典型使用场景

                                                Salt            随机数据，用于与密码结合形成密钥，防止彩虹表攻击。      密码哈希存储

                                                PassPhrase      用户自定义密钥，作为加密算法的输入之一                 加密敏感数据 (如数据库连接字符串)
                */

                /*
                    三、字符串加密选项   AbpStringEncryptionOptions选项类

                            默认值可以配置为AbpStringEncryptionOptions类型。

                                    Configure<AbpStringEncryptionOptions>(opts =>
                                    {
                                        opts.DefaultPassPhrase = "MyStrongPassPhrase";
                                        opts.DefaultSalt = Encoding.UTF8.GetBytes("MyStrongSalt");
                                        opts.InitVectorBytes = Encoding.UTF8.GetBytes("YetAnotherStrongSalt");
                                        opts.Keysize = 512;
                                    });

                                ①、 DefaultPassPhrase：加密/解密文本的默认密码。为了安全起见，建议设置为另一个值。默认值：gsKnGZ041HLL4IM8

                                ②、DefaultSalt：在加密/解密时用作盐的值。默认值：Encoding.ASCII.GetBytes("hgt!16kl")

                                ③、InitVectorBytes：此常量字符串用作PasswordDeriveBytes函数调用的“盐”值。IV的大小（以字节为单位）必须=（keysize/8）。
                                                   默认密钥大小为256，因此IV必须为32字节长。在这里使用16个字符的字符串，当转换为字节数组时，我们得到了32个字节。

                                                   默认值：Encoding.ASCII.GetBytes("jkE49230Tf093b42")

                                ④、Keysize：此常量用于确定加密算法的密钥大小。默认值：256
                */
        </script>
    </body>
</html>